'''
Author: 梦付千秋星垂野 465943794@qq.com
Date: 2023-03-14 14:00:52
LastEditors: 梦付千秋星垂野 465943794@qq.com
LastEditTime: 2023-03-28 10:18:33
FilePath: /base_machinelearning/HandsOnPytorch/7-2AlexNet.py
Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
'''
import torch
from torch import nn
# from d2l import torch as d2l
class Net(nn.Module):    
    def __init__(self):
        super(Net, self).__init__()
          
        self.features = nn.Sequential(

        # 这里使用一个11*11的更大窗口来捕捉对象。
        # 同时，步幅为4，以减少输出的高度和宽度。
        # 另外，输出通道的数目远大于LeNet
        nn.Conv2d(1, 96, kernel_size=5, stride=4, padding=1), nn.ReLU(),
        #nn.MaxPool2d(kernel_size=3, stride=2),
        # 减小卷积窗口，使用填充为2来使得输入与输出的高和宽一致，且增大输出通道数
        nn.Conv2d(96, 256, kernel_size=3, padding=2), nn.ReLU(),
        #nn.MaxPool2d(kernel_size=3, stride=2),
        # 使用三个连续的卷积层和较小的卷积窗口。
        # 除了最后的卷积层，输出通道的数量进一步增加。
        # 在前两个卷积层之后，汇聚层不用于减少输入的高度和宽度
        nn.Conv2d(256, 384, kernel_size=3, padding=1), nn.ReLU(),
        # nn.Conv2d(384, 384, kernel_size=3, padding=1), nn.ReLU(),
        # nn.Conv2d(384, 256, kernel_size=3, padding=1), nn.ReLU(),
        # nn.MaxPool2d(kernel_size=3, stride=2),
        nn.Flatten(),
        # 这里，全连接层的输出数量是LeNet中的好几倍。使用dropout层来减轻过拟合
        #这里输入变化了全连接层大小也会变化

        
        nn.Linear(31104, 4096), nn.ReLU(),
        nn.Dropout(p=0.5),
        nn.Linear(4096, 4096), nn.ReLU(),
        nn.Dropout(p=0.5),
        # 最后是输出层。由于这里使用Fashion-MNIST，所以用类别数为10，而非论文中的1000
        nn.Linear(4096, 10))
    def forward(self,x):
         x = self.features(x)
         return x
if __name__ == '__main__':
    X = torch.randn(1, 1, 28, 28)
    model=Net()
    for layer in model.features:
        X=layer(X)
        print(layer.__class__.__name__,'output shape:\t',X.shape)
            